#include "KeyFrameExtractor.h"
#include <QProcess>
#include <QDir>
#include <QDebug>
#include <QFileInfo>
#include <QRegularExpression>
#include <QPixmap>
#include <QTime>


KeyFrameExtractor::KeyFrameExtractor(QObject* parent)
    : QObject(parent)
{
}

KeyFrameExtractor::~KeyFrameExtractor()
{
}

QVector<T_KeyFrameTableViewModel::KeyFrameItem> KeyFrameExtractor::extractKeyFrames(const QString& videoPath, const QString& outputFolder)
{
    QVector<T_KeyFrameTableViewModel::KeyFrameItem> keyFrames;

    QDir dir(outputFolder);

    // 清空旧的 keyframe - *.jpg ───
    if (dir.exists()) {
        auto oldFiles = dir.entryList( QStringList() << "keyframe-*.jpg",QDir::Files);
            for (const QString& f : oldFiles) {
                dir.remove(f);
            }
        }
        else {
            dir.mkpath(".");
        }
    // ───────────────────────────────────────

    // 2) 动态读取帧率
    double fps = 25.0; // 默认
    {
        QProcess probe;
        QStringList args = {
            "-v", "error",
            "-select_streams", "v:0",
            "-show_entries",    "stream=r_frame_rate",
            "-of",              "default=noprint_wrappers=1:nokey=1",
            videoPath
        };
        probe.start("ffprobe", args);
        if (probe.waitForFinished(2000)) {
            QString out = QString::fromUtf8(probe.readAllStandardOutput()).trimmed();
            // out 可能是 "30000/1001" 或 "30"
            if (out.contains('/')) {
                auto parts = out.split('/');
                if (parts.size()==2) {
                    bool ok1, ok2;
                    double num = parts[0].toDouble(&ok1);
                    double den = parts[1].toDouble(&ok2);
                    if (ok1 && ok2 && den>0) fps = num/den;
                }
            } else {
                bool ok;
                double v = out.toDouble(&ok);
                if (ok && v>0) fps = v;
            }
        }
        qDebug() << "Detected FPS =" << fps;
    }

    // 构造 FFmpeg 命令
    // 注意：如果 ffmpeg.exe 没有在 PATH 中，请使用完整路径
    QString command = "ffmpeg";
    QStringList arguments;
    arguments << "-skip_frame" << "nokey"
              << "-i" << videoPath
              << "-vsync" << "0"
              << "-frame_pts" << "true"
              << QString("%1/keyframe-%06d.jpg").arg(outputFolder);

    QProcess process;
    process.start(command, arguments);
    // 等待命令执行完成（-1 表示无限等待）
    if (!process.waitForFinished(-1)) {
        qDebug() << "FFmpeg extraction failed:" << process.errorString();
        return keyFrames;
    }
    qDebug() << "FFmpeg extraction finished.";

    // 读取输出文件夹中的图片文件（假设命名格式为 keyframe-0001.jpg, keyframe-0002.jpg, ...）
    QStringList nameFilters;
    nameFilters << "keyframe-*.jpg";
    QFileInfoList fileList = dir.entryInfoList(nameFilters, QDir::Files, QDir::Name);

    // 假设视频帧率为 25fps，则图片中的数字除以 25 得到时间（秒）
    for (const QFileInfo &fileInfo : fileList) {
        QString fileName = fileInfo.fileName();
        // 正则表达式匹配文件名中的数字部分
        QRegularExpression re(R"(keyframe-(\d+)\.jpg)");
        QRegularExpressionMatch match = re.match(fileName);
        if (match.hasMatch()) {
            QString numberStr = match.captured(1);
            int frameNumber = numberStr.toInt();
            double seconds = frameNumber / fps; // 如果帧率不是25，需要调整
            QString timestamp = QTime(0,0).addSecs(int(seconds)).toString("yyyy-MM-dd hh:mm:ss.zzz");
            QPixmap pix(fileInfo.absoluteFilePath());
            // 缩放图片到 160x90 尺寸
            pix = pix.scaled(160, 90, Qt::KeepAspectRatio, Qt::SmoothTransformation);

            T_KeyFrameTableViewModel::KeyFrameItem item;
            item.thumbnail = pix;
            item.timestamp = timestamp;
            item.analysis = ""; // 分析信息先留空

            keyFrames.append(item);
        }
    }

    return keyFrames;
}
